package kk.service;

import kk.domain.Architect;
import kk.domain.Designer;
import kk.domain.Employee;
import kk.domain.Programmer;

public class TeamService {
    private static int counter=1;//给memberId赋值用
    private final int MAX_MEMBER=5;//团队中最大人数
    private Programmer[] team=new Programmer[MAX_MEMBER];//保存开发团队队员
    private int total=0;//记录团队中的实际人员


    public TeamService() {
    }

    /**
     * 获取开发团队的所有成员
     * @return
     */
    public Programmer[] getTeam(){
        Programmer[] team=new Programmer[total];
        for (int i=0;i<team.length;i++){
            team[i]=this.team[i];
        }
        return team;
    }

    /**
     * 向团队中添加员工
     *
     * 成员已满，无法添加
     * 该成员不是开发人员，无法添加
     * 该员工已在本开发团队中
     * 该员工已是某团队成员
     * 该员正在休假，无法添加
     * 团队中至多只能有一名架构师
     * 团队中至多只能有两名设计师
     * 团队中至多只能有三名程序员
     */
    public void addMember(Employee employee) throws TeamException {
        //成员已满，无法添加
        if (total>=MAX_MEMBER){
            throw new TeamException("成员已满，无法添加。");
        }
        //该成员不是开发人员，无法添加
        if (!(employee instanceof Programmer)){
            throw new TeamException("该成员不是开发人员，无法添加");
        }
        //该员工已在本开发团队中
        if (isExit(employee)){
            throw new TeamException("该员工已在本开发团队中");
        }
        //该员工已是某团队成员
        //该员工正在休假，无法添加
        Programmer p=(Programmer)employee;
        if("BUSY".equals(p.getStatus().getNAME())){
            throw new TeamException("该员工已是某团队成员");
        }else if ("VACATION".equals(p.getStatus().getNAME())){
            throw new TeamException("该员工正在休假，无法添加");
        }

//        团队中至多只能有一名架构师
//        团队中至多只能有两名设计师
//        团队中至多只能有三名程序员

        //计算出团队中架构师、设计师、程序员的数量
        int numOfArch = 0,numOfDes = 0,numOfPro = 0;
        for (int i=0;i<total;i++){
            if (team[i] instanceof Architect){
                numOfArch++;
            }else if(team[i] instanceof Designer){
                numOfDes++;
            }else if(team[i] instanceof Programmer){
                numOfPro++;
            }
        }

        if (employee instanceof Architect){
            if (numOfArch>=1){
                throw new TeamException("团队中至多只能有一名架构师");
            }
        }else if (employee instanceof Designer){
            if (numOfDes>=2){
                throw new TeamException("团队中至多只能有两名设计师");
            }
        }else if (employee instanceof Programmer){
            if (numOfPro>=3){
                throw new TeamException("团队中之多只能有三名程序员");
            }
        }

        //将p添加到现有的团队中
        team[total]=p;
        total++;

        p.setStatus(Status.BUSY);
        p.setMemberId(counter++);

    }

    /**
     * 判断该成员是否已经在开发团队中
     * @param employee
     * @return
     */
    private boolean isExit(Employee employee) {
        for (Programmer programmer : team) {
            if (programmer.getId()==employee.getId()){
                //已经存在了
                return true;
            }
        }
        return false;
    }

    /**
     * 删除指定员工
     * @param memberId
     */
    public void removeMember(int memberId) throws TeamException {
        //找到指定员工后将员工的状态设为free
        int i=0;
        for(;i<total;i++){
            if (team[i].getMemberId()==memberId){
                team[i].setStatus(Status.FREE);
                break;
            }
        }

        //未找到指定员工
        if (i==total){
            throw new TeamException("未找到指定员工");
        }


        for (int j=i+1;j<total;j++){
            team[j-1]=team[j];
        }

        team[total-1]=null;
        total--;
    }
}
